package com.qf.controller;

import com.alibaba.fastjson.JSON;
import com.qf.util.StrUtils;

import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.util.UUID;

/**
 * 文件上传
 * @author 千锋健哥
 */
@WebServlet("/upload")
//设置上传文件的大小限制, maxFileSize设置文件最大值, maxRequestSize设置请求最大值
@MultipartConfig(maxFileSize = 1024*1024*4, maxRequestSize = 1024*1024*20)
public class UploadController extends BaseController{

    /**
     * 文件上传, 保存文件到硬盘上
     * @param request
     * @param response
     * @return
     */
    public String uploadFile(HttpServletRequest request, HttpServletResponse response) throws Exception {
        //1. 获取文件上传对象
        Part picture = request.getPart("file");

        //2. 设置文件保存位置, 是编译后的位置, 这样tomcat不重启依然通过浏览器可以查看图片
        // 例如: D:\ideaWorkspace\java2306\xiaomiParent\xiaomi_controller\target\xiaomi_controller\\upload
        String path = request.getServletContext().getRealPath("upload");
        System.out.println("path====" + path);

        //3. 判断保存的位置中, 文件夹是否存在
        File dir = new File(path);
        if (!dir.exists()) {
            //4. 如果保存文件的文件夹不存在则自动创建
            dir.mkdirs();
        }

        //5. 获取文件名字, 例如: xxxxx.jpg
        String submittedFileName = picture.getSubmittedFileName();
        if (StrUtils.empty(submittedFileName)) {
            //6. 获取文件扩展名
            String ext = submittedFileName.substring(submittedFileName.lastIndexOf("."));
            //7. 使用随机字符串+扩展名作为新文件名, 防止文件重名覆盖
            String fileName = UUID.randomUUID().toString().replace("-", "") + ext;
            //8. 通过流将文件写入到对应的文件夹中
            response.setContentType("text/json;charset=utf-8");
            //通过流将文件写入到硬盘
            String realPath = path + "\\" + fileName;
            picture.write(realPath);

            //9. 返回文件上传的路径和文件名给前端
            String jsonStr = JSON.toJSONString(fileName);
            response.getWriter().write(jsonStr);
        }
       return null;
    }
}
